package com.hry.sunflower.images.utils;

import net.coobird.thumbnailator.Thumbnails;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * @Desc 图片工具类
 * @Author houry
 * @Date 2021/1/25 9:21
 **/
public class ImageUtils {

    /**
     * 校验是不是图片
     *
     * @param in 文件输入流
     * @return 校验结果
     * @throws IOException
     */
    public static boolean isImage(InputStream in) throws IOException {
        BufferedImage bi = ImageIO.read(in);
        return bi == null;
    }


    /**
     * 旋转图片
     *
     * @param path       处理后的图片保存地址
     * @param originFile 源图片
     * @param rotate     旋转角度-正数则为顺时针，负数则为逆时针
     * @return 旋转后的图片
     * @throws IOException
     */
    public static File rotate(String path, File originFile, double rotate) throws IOException {
        File newFile = new File(path + originFile.getName());
        Thumbnails.of(originFile).rotate(rotate).toFile(newFile);
        return newFile;
    }

    /**
     * 按照比例进行缩小和放大
     *
     * @param path       处理后的图片保存地址
     * @param originFile 源图片
     * @param scale      伸缩比例，如果大于0则是按照比例放大图片，如果小于0则是按照比例缩小图片
     * @return 处理结果
     * @throws IOException
     */
    public static File scale(String path, File originFile, double scale) throws IOException {
        File newFile = new File(path + originFile.getName());
        Thumbnails.of(originFile).scale(scale).toFile(newFile);
        return newFile;
    }


    /**
     * 图片尺寸不变，压缩图片文件大小outputQuality实现,参数1为最高质量
     *
     * @param path       处理后的图片保存地址
     * @param originFile 源图片
     * @param quality    图片质量
     * @return 处理结果
     * @throws IOException
     */
    public static File compression(String path, File originFile, double quality) throws IOException {
        File newFile = new File(path + originFile.getName());
        Thumbnails.of(originFile).scale(1f).outputQuality(quality).toFile(newFile);
        return newFile;
    }


    public static void main(String[] args) throws IOException {
        MultipartFile file = null;
        File fromPic = new File("C:\\Users\\houry\\Desktop\\3.jpg");
        File toPic = new File("C:\\Users\\houry\\Desktop\\5.jpg");

//         压缩图片指定大小
//        Thumbnails.of(fromPic).size(400,500).toFile(toPic);

        //按照比例进行缩小和放大
//        Thumbnails.of(fromPic).scale(0.2f).toFile(toPic);//按比例缩小


//        //不按比例，就按指定的大小进行缩放
//        Thumbnails.of(fromPic).size(100, 100).keepAspectRatio(false).toFile(toPic);
//        //或者Thumbnails.of(fromPic).forceSize(100,100).toFile(toPic);


//        //图片尺寸不变，压缩图片文件大小outputQuality实现,参数1为最高质量
        Thumbnails.of(fromPic).scale(1f).outputQuality(1f).toFile(toPic);


//        //给图片加水印，watermark(位置，水印图，透明度)Positions.CENTER表示加在中间
//        Thumbnails.of(fromPic).size(400, 400)
//                .watermark(Positions.CENTER, ImageIO.read(waterPic), 0.5f)
//                .outputQuality(0.8f).toFile(toPic);
//
//
//        //用sourceRegion()实现图片裁剪
//        //图片中心300*300的区域,Positions.CENTER表示中心，还有许多其他位置可选
//        Thumbnails.of(fromPic).sourceRegion(Positions.CENTER, 300, 300)
//                .size(300, 300).toFile(toPic);
//
//
//        //图片中上区域300*300的区域
//        Thumbnails.of(fromPic).sourceRegion(Positions.TOP_CENTER, 300, 300)
//                .size(300, 300).toFile(toPic);
//
//        //用outputFormat(图像格式)转换图片格式，保持原尺寸不变
//        Thumbnails.of(fromPic).scale(1f).outputFormat("png")
//                .toFile("picture/png格式的图片.png");
//
//
//        //输出成文件流OutputStream
//        OutputStream os = new FileOutputStream(toPic);
//        Thumbnails.of(fromPic).size(120, 120).toOutputStream(os);
//
//
//        //输出BufferedImage,asBufferedImage()返回BufferedImage
//        BufferedImage bi = Thumbnails.of(fromPic).size(120, 120).asBufferedImage();
//        ImageIO.write(bi, "jpg", toPic);
//
//
//        //压缩至指定图片尺寸（例如：横400高300），保持图片不变形，多余部分裁剪掉(这个是引的网友的代码)
//        BufferedImage image = ImageIO.read(fromPic);
//
//        Thumbnails.Builder<BufferedImage> builder = null;
//
//        int imageWidth = image.getWidth();
//        int imageHeitht = image.getHeight();
//        if ((float) 300 / 400 != (float) imageWidth / imageHeitht) {
//            if (imageWidth > imageHeitht) {
//                image = Thumbnails.of(fromPic).height(300).asBufferedImage();
//            } else {
//                image = Thumbnails.of(fromPic).width(400).asBufferedImage();
//            }
//            builder = Thumbnails.of(image).sourceRegion(Positions.CENTER, 400, 300).size(400, 300);
//        } else {
//            builder = Thumbnails.of(image).size(400, 300);
//        }
//        builder.outputFormat("jpg").toFile(toPic);
//

    }


}
